/**
 ******************************************************************************
 * @file           : bsp_tim_pwm.h
 * @brief          : Timer PWM Driver Header File
 ******************************************************************************
 * @attention
 *
 * 定时器PWM驱动程序头文件
 * 支持高级定时器（TIM1, TIM8）和通用定时器（TIM2-5）的PWM输出功能
 * 提供多通道PWM控制接口
 *
 * 适配平台：STM32F1xx
 *
 ******************************************************************************
 */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __BSP_TIM_PWM_H
#define __BSP_TIM_PWM_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include "stm32f1xx.h"

/* ============================================================================ */
/*                          配置宏定义（用户可修改）                             */
/* ============================================================================ */

/* PWM定时器选择（只能选择一个）*/
//#define PWM_TIM_USE_TIM1                              /*!< 使用TIM1（高级定时器） */
//#define PWM_TIM_USE_TIM2                              /*!< 使用TIM2（通用定时器） */
#define PWM_TIM_USE_TIM3                                /*!< 使用TIM3（通用定时器） */
//#define PWM_TIM_USE_TIM4                              /*!< 使用TIM4（通用定时器） */
//#define PWM_TIM_USE_TIM5                              /*!< 使用TIM5（通用定时器） */
//#define PWM_TIM_USE_TIM8                              /*!< 使用TIM8（高级定时器，部分型号） */

/* GPIO配置（根据选择的定时器自动配置）*/
#ifdef PWM_TIM_USE_TIM1
    /* TIM1通道配置 */
    #define PWM_GPIO_PORT                   GPIOA
    #define PWM_GPIO_CLK_ENABLE()           __HAL_RCC_GPIOA_CLK_ENABLE()
    
    #define PWM_CH1_PIN                     GPIO_PIN_8                  /*!< TIM1_CH1: PA8 */
    #define PWM_CH2_PIN                     GPIO_PIN_9                  /*!< TIM1_CH2: PA9 */
    #define PWM_CH3_PIN                     GPIO_PIN_10                 /*!< TIM1_CH3: PA10 */
    #define PWM_CH4_PIN                     GPIO_PIN_11                 /*!< TIM1_CH4: PA11 */
#endif

#ifdef PWM_TIM_USE_TIM3
    /* TIM3通道配置 */
    #define PWM_GPIO_PORT                   GPIOB                       /*!< GPIO端口 */
    #define PWM_GPIO_CLK_ENABLE()           __HAL_RCC_GPIOB_CLK_ENABLE() /*!< GPIO时钟 */
    
    #define PWM_CH1_PIN                     GPIO_PIN_4                  /*!< TIM3_CH1: PB4 */
    #define PWM_CH2_PIN                     GPIO_PIN_5                  /*!< TIM3_CH2: PB5 */
    #define PWM_CH3_PIN                     GPIO_PIN_0                  /*!< TIM3_CH3: PB0 */
    #define PWM_CH4_PIN                     GPIO_PIN_1                  /*!< TIM3_CH4: PB1 */
#endif

#ifdef PWM_TIM_USE_TIM2
    /* TIM2通道配置 */
    #define PWM_GPIO_PORT                   GPIOA
    #define PWM_GPIO_CLK_ENABLE()           __HAL_RCC_GPIOA_CLK_ENABLE()
    
    #define PWM_CH1_PIN                     GPIO_PIN_0                  /*!< TIM2_CH1: PA0 */
    #define PWM_CH2_PIN                     GPIO_PIN_1                  /*!< TIM2_CH2: PA1 */
    #define PWM_CH3_PIN                     GPIO_PIN_2                  /*!< TIM2_CH3: PA2 */
    #define PWM_CH4_PIN                     GPIO_PIN_3                  /*!< TIM2_CH4: PA3 */
#endif

#ifdef PWM_TIM_USE_TIM4
    /* TIM4通道配置 */
    #define PWM_GPIO_PORT                   GPIOB
    #define PWM_GPIO_CLK_ENABLE()           __HAL_RCC_GPIOB_CLK_ENABLE()
    
    #define PWM_CH1_PIN                     GPIO_PIN_6                  /*!< TIM4_CH1: PB6 */
    #define PWM_CH2_PIN                     GPIO_PIN_7                  /*!< TIM4_CH2: PB7 */
    #define PWM_CH3_PIN                     GPIO_PIN_8                  /*!< TIM4_CH3: PB8 */
    #define PWM_CH4_PIN                     GPIO_PIN_9                  /*!< TIM4_CH4: PB9 */
#endif

#ifdef PWM_TIM_USE_TIM5
    /* TIM5通道配置 */
    #define PWM_GPIO_PORT                   GPIOA
    #define PWM_GPIO_CLK_ENABLE()           __HAL_RCC_GPIOA_CLK_ENABLE()
    
    #define PWM_CH1_PIN                     GPIO_PIN_0                  /*!< TIM5_CH1: PA0 */
    #define PWM_CH2_PIN                     GPIO_PIN_1                  /*!< TIM5_CH2: PA1 */
    #define PWM_CH3_PIN                     GPIO_PIN_2                  /*!< TIM5_CH3: PA2 */
    #define PWM_CH4_PIN                     GPIO_PIN_3                  /*!< TIM5_CH4: PA3 */
#endif

#ifdef PWM_TIM_USE_TIM8
    /* TIM8通道配置 */
    #define PWM_GPIO_PORT                   GPIOC
    #define PWM_GPIO_CLK_ENABLE()           __HAL_RCC_GPIOC_CLK_ENABLE()
    
    #define PWM_CH1_PIN                     GPIO_PIN_6                  /*!< TIM8_CH1: PC6 */
    #define PWM_CH2_PIN                     GPIO_PIN_7                  /*!< TIM8_CH2: PC7 */
    #define PWM_CH3_PIN                     GPIO_PIN_8                  /*!< TIM8_CH3: PC8 */
    #define PWM_CH4_PIN                     GPIO_PIN_9                  /*!< TIM8_CH4: PC9 */
#endif

/* PWM默认参数 */
#define PWM_DEFAULT_FREQ                10000                           /*!< 默认PWM频率（Hz） */
#define PWM_DEFAULT_DUTY                50                              /*!< 默认占空比（%） */

/* ============================================================================ */
/*                          类型定义                                            */
/* ============================================================================ */

/* Exported types ------------------------------------------------------------*/
/**
 * @brief PWM错误码枚举
 */
typedef enum
{
    PWM_OK = 0,             /*!< 成功 */
    PWM_ERROR_PARAM,        /*!< 参数错误 */
    PWM_ERROR_HAL,          /*!< HAL库错误 */
    PWM_ERROR_NOT_INIT      /*!< 未初始化 */
} PWM_Error_e;

/**
 * @brief PWM通道枚举
 */
typedef enum
{
    PWM_CHANNEL_1 = 0,      /*!< 通道1 */
    PWM_CHANNEL_2,          /*!< 通道2 */
    PWM_CHANNEL_3,          /*!< 通道3 */
    PWM_CHANNEL_4,          /*!< 通道4 */
    PWM_CHANNEL_ALL         /*!< 所有通道 */
} PWM_Channel_e;

/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported variables --------------------------------------------------------*/
extern TIM_HandleTypeDef g_tim_pwm_handle;              		/* PWM定时器句柄 */

/* Exported functions --------------------------------------------------------*/

/* 初始化函数 */
void tim_pwm_init(uint32_t freq, uint8_t duty);        			/* PWM初始化 */
void tim_pwm_deinit(void);                              		/* PWM反初始化 */

/* PWM控制函数 */
void tim_pwm_start(PWM_Channel_e channel);              		/* 启动PWM输出 */
void tim_pwm_stop(PWM_Channel_e channel);               		/* 停止PWM输出 */
void tim_pwm_set_duty(PWM_Channel_e channel, uint8_t duty); 	/* 设置占空比 */
void tim_pwm_set_freq(uint32_t freq);                   		/* 设置PWM频率 */

/* 高级控制函数 */
void tim_pwm_set_pulse(PWM_Channel_e channel, uint16_t pulse);	/* 设置脉冲宽度 */
uint16_t tim_pwm_get_pulse(PWM_Channel_e channel);     			/* 获取脉冲宽度 */
uint16_t tim_pwm_get_period(void);                      		/* 获取周期值 */

#ifdef __cplusplus
}
#endif

#endif /* __BSP_TIM_PWM_H */
